<?php

/**
 * 投票（调查问卷）管理端控制器
 * Class Vote
 */
class Vote extends IController implements adminAuthorization
{
    public $checkRight = 'all';
    public $layout = 'admin';

    function init()
    {

    }

    public function vote_list()
    {
        $page = IReq::get('page') ? IFilter::act(IReq::get('page'), 'int') : 1;
        $voteObj = new IQuery('vote');
        $voteObj->page = $page;
        $voteData = $voteObj->find();
        $this->voteData = $voteData;
        $this->voteObj = $voteObj;
        $this->redirect('vote_list');
    }

    public function vote_add()
    {
        if ($_POST) {
            // 获取用户输入数据
            $vote_title = IFilter::act(IReq::get('vote_title'));
            $start_date = IFilter::act(IReq::get('start_date'));
            $end_date = IFilter::act(IReq::get('end_date'));
            $total_pages = IFilter::act(IReq::get('total_pages'), 'int');
            $vote_status = IFilter::act(IReq::get('vote_status'), 'int');
            $vote_description = IFilter::act(IReq::get('vote_description'), 'string'); // 增强XSS过滤
            $created_at = ITime::getDateTime();
            $updated_at = null;
            $deleted_at = null;

            // 1. 校验必填字段并设置默认值
            $vote_title = trim($vote_title ?? '');
            // 限制标题长度（假设数据库字段varchar(255)）
            // 与数据库字段长度严格匹配（假设字段定义为varchar(255)）
            $vote_title = mb_substr($vote_title, 0, 255, 'UTF-8');
            if (mb_strlen($vote_title, 'UTF-8') > 255) {
                throw new Exception('投票标题长度超过255字符限制');
            }
            if (empty($vote_title)) {
                $vote_title = '未命名投票'; // 空标题默认值
            }

            // 2. 校验日期格式（YYYY-MM-DD HH:MM:SS）
            $valid_date_format = '/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/';
            $start_date = preg_match($valid_date_format, $start_date) ? $start_date : date('Y-m-d H:i:s'); // 无效日期默认当前时间
            // 校验开始日期不早于当前时间（业务需求：投票不能在过去开始）
            if (strtotime($start_date) < strtotime('now')) {
                $start_date = date('Y-m-d H:i:s'); // 重置为当前时间
            }
            $end_date = preg_match($valid_date_format, $end_date) ? $end_date : date('Y-m-d H:i:s', strtotime('+1 month')); // 无效结束日期默认1个月后

            // 校验结束日期不早于开始日期
            if (strtotime($end_date) <= strtotime($start_date)) {
                $end_date = date('Y-m-d H:i:s', strtotime($start_date) + 86400); // 默认延长1天
            }

            // 3. 校验总页数（至少1页）
            // 确保总页数为正整数（防止非数字输入）
            $total_pages = (int)$total_pages;
            $total_pages = max($total_pages, 1); // 非正整数默认1
            // 限制最大页数（防止异常大数值）
            $total_pages = min($total_pages, 1000); // 最大1000页

            // 4. 校验投票状态（默认1-进行中）
            // 严格校验投票状态（仅允许1-进行中，2-已结束，3-草稿）
            $valid_status = [1 => '进行中', 2 => '已结束', 3 => '草稿'];
            // 强制转换为整数类型（防止字符串输入，补充类型说明）
            $vote_status = (int)$vote_status;
            if (!array_key_exists($vote_status, $valid_status)) {
                ISession::set('vote_error', '无效的投票状态值，已自动重置为默认');
                $vote_status = 1; // 重置为默认状态并记录提示
            }

            // 5. 生成并校验UUID（确保36位）
            // 校验UUID生成方法存在性（补充方法描述）
            if (!method_exists('Common', 'create_uuid')) {
                throw new Exception('UUID生成方法不存在，请检查Common类是否包含create_uuid静态方法');
            }
            $uuid = Common::create_uuid();
            if (strlen($uuid) !== 36) {
                throw new Exception('生成的UUID格式错误，长度应为36位');
            }

            // 构造入库数据
            $insert_data = [
                'id' => $uuid,
                'vote_title' => $vote_title,
                'start_date' => $start_date,
                'end_date' => $end_date,
                'total_pages' => $total_pages,
                'vote_status' => $vote_status,
                'vote_description' => $vote_description ?? '', // 描述允许为空
                'created_at' => $created_at ?? date('Y-m-d H:i:s'), // 未传创建时间默认当前时间
                'updated_at' => $updated_at ?? date('Y-m-d H:i:s'), // 未传更新时间默认当前时间
                'deleted_at' => $deleted_at // 软删除时间允许为null
            ];

            // 创建模型对象并插入数据（带异常处理）
            try {
                // 校验IModel类存在性（防止类未定义错误）
            if (!class_exists('IModel')) {
                throw new Exception('数据库模型类IModel不存在');
            }
            $voteObj = new IModel('vote');
            // 校验setData方法存在性（防止方法未定义错误）
            if (!method_exists($voteObj, 'setData')) {
                throw new Exception('IModel类缺少setData方法');
            }
                $voteObj->setData($insert_data);
                // 校验add方法存在性（防止方法未定义错误）
            if (!method_exists($voteObj, 'add')) {
                throw new Exception('IModel类缺少add方法');
            }
            $success = $voteObj->add();
            // 兼容不同数据库驱动的返回值（可能返回布尔或插入ID）
            $success = is_numeric($success) ? ($success > 0) : (bool)$success; // 统一转换为布尔值

                if ($success) {
                    $this->redirect('vote_list'); // 跳转到问卷列表页面
                } else {
                    ISession::set('vote_error', '问卷添加失败：数据库插入失败');
                    $this->redirect('vote_add'); // 保留错误信息并重定向回表单
                }
            } catch (Exception $e) {
                // 记录详细错误日志（使用系统日志功能）
                // 确保日志类存在（防止类未定义错误）
                if (class_exists('ILog')) {
                    $log = new ILog();
                    $log->write('投票添加失败（用户ID:'.(ISession::get('user_id')??'游客').'，时间:'.date('Y-m-d H:i:s').'）：'.$e->getMessage().' 数据：'.json_encode($insert_data), 'vote_error');
                }
                // 确保Session类存在（防止类未定义错误）
                if (class_exists('ISession')) {
                    ISession::set('vote_error', '系统繁忙，请稍后再试'); // 友好的用户提示
                }
                $this->redirect('vote_add');
            }
        } else {
            $this->redirect('vote_add');
        }
    }

    public function vote_edit()
    {
        if ($_POST) {
            // 获取要修改的问卷 ID
            $vote_id = IFilter::act(IReq::get('id'), 'int');

            // 获取用户输入的新数据
            $vote_title = IFilter::act(IReq::get('vote_title'));
            $start_date = IFilter::act(IReq::get('start_date'));
            $end_date = IFilter::act(IReq::get('end_date'));
            $total_pages = IFilter::act(IReq::get('total_pages'), 'int');
            $vote_status = IFilter::act(IReq::get('vote_status'), 'int');
            $vote_description = IFilter::act(IReq::get('vote_description'));
            $updated_at = ITime::getDateTime();

            // 准备更新的数据
            $update_data = [
                'vote_title' => $vote_title,
                'start_date' => $start_date,
                'end_date' => $end_date,
                'total_pages' => $total_pages,
                'vote_status' => $vote_status,
                'vote_description' => $vote_description,
                'updated_at' => $updated_at
            ];

            // 创建模型对象并更新数据
            $voteObj = new IModel('vote');
            $voteObj->setData($update_data);
            $condition = 'id = ' . $vote_id;
            $success = $voteObj->update($condition);

            if ($success) {
                $this->redirect('vote_list'); // 重定向到问卷列表页面
            } else {
                echo $voteObj->getSql();
                echo '问卷修改失败';
            }
        } else {
            // 获取要修改的问卷 ID
            $vote_id = IFilter::act(IReq::get('id'), 'int');

            // 查询问卷信息并传递给视图
            $voteObj = new IModel('vote');
            $this->vote_info = $voteObj->getObj('id = ' . $vote_id);
            $this->redirect('vote_edit');
        }
    }

    public function question()
    {
        $voteId = IFilter::act(IReq::get('vote_id'), 'int');
        $where = [];
        $where[] = " vote_id={$voteId}";
        $condition = implode(" and ", $where);
        $page = IReq::get('page') ? IFilter::act(IReq::get('page'), 'int') : 1;
        $questionObj = new IQuery('question');
        $questionObj->where = $condition;
        $questionObj->page = $page;
        $questionData = $questionObj->find();
        $this->questionData = $questionData;
        $this->questionObj = $questionObj;
        $this->voteId = $voteId;
        $this->redirect('question');
    }

    /**
     * 添加问卷题目
     * 本地地址：http://wenku.me/index.php?controller=vote&action=question_add
     */
    public function question_add()
    {
        $this->voteId = IFilter::act(IReq::get('vote_id'));
        $this->redirect('question_add');
    }

    public function question_add_act()
    {
        // 获取用户输入数据
        $voteId = IFilter::act(IReq::get('voteId'));
        $questionTitle = IFilter::act(IReq::get('questionTitle'));
        $questionType = IFilter::act(IReq::get('questionType'));
        $questionNumber = IFilter::act(IReq::get('questionNumber'), 'int');
        $isRequired = IFilter::act(IReq::get('isRequired'), 'int');
        $pageNumber = IFilter::act(IReq::get('pageNumber'), 'int');

        // 准备入库数据到 iwebshop_question 表
        $questionInsertData = [
            'vote_id' => $voteId,
            'question_text' => $questionTitle,
            'question_type' => $questionType,
            'required' => $isRequired,
            'sort_order' => $questionNumber,
            'page_number' => $pageNumber,
            'created_at' => ITime::getDateTime(),
            'updated_at' => ITime::getDateTime()
        ];

        // 创建模型对象并插入问题数据
        $questionModel = new IModel('question');
        $questionModel->setData($questionInsertData);
        $questionInsertSuccess = $questionModel->add();
        if ($questionInsertSuccess && $questionInsertSuccess > 0) { //判断题目添加成功，并且大于0
            // 处理选项数据
            $options = (array)IReq::get('option');
            if (!empty($options)) {
                foreach ($options as $index => $optionText) {
                    if (!empty($optionText)) {
                        // 准备入库数据到 iwebshop_question_option 表
                        $optionInsertData = [
                            'question_id' => $questionInsertSuccess,
                            'option_text' => $optionText,
                            'sort_order' => $index
                        ];

                        // 创建模型对象并插入选项数据
                        $optionModel = new IModel('question_option');
                        $optionModel->setData($optionInsertData);
                        $optionInsertSuccess = $optionModel->add();

                        if (!$optionInsertSuccess) {
                            echo '选项插入失败';
                        }
                    }
                }
            }

            echo '问卷问题及选项添加成功';
        } else {
            echo '问卷问题添加失败';
        }
    }

    public function getAnswerListById()
    {
        $question_id = IFilter::act(IReq::get('question_id'));
        $Obj = new IModel('question_option');
        $option = $Obj->query("question_id = $question_id");
        echo json_encode([
            'code' => 200,
            'msg' => 'Success',
            'data' => $option
        ]);
    }

    
}